/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modeles;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

/**
 *
 * @author Christian
 */
@Entity
public class Produit implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(nullable=false, columnDefinition="long varchar")
    private String nom;
    @Column(nullable=false)
    private float prix;
    @Column(nullable=false, columnDefinition="long varchar")
    private String distributeur;
    @Column(nullable=false, columnDefinition="long varchar")
    private String description;
    @OneToMany(cascade= CascadeType.ALL)
    private Collection<Photo> photos = new ArrayList<Photo>();
    @OneToMany(cascade= CascadeType.ALL)
    private Collection<Video> videos = new ArrayList<Video>();
    @ManyToMany
    private Collection<Tag> tags = new ArrayList<Tag>();
    @ManyToOne
    @JoinColumn(nullable=false)
    private CategorieAge categorieAge;
    @ManyToMany
    private Collection<Produit> produitsAutresCategories = new ArrayList<Produit>();
    @ManyToOne
    @JoinColumn(nullable=false)
    private CategorieProduit categorieProduit;
    @OneToOne
    private Photo photoPrincipale;
    int nombreDeConsultation;
    
    public Produit(){
    }
    
    public Produit(String nom, float prix, String distributeur, String description, CategorieProduit categorieProduit, 
            CategorieAge categorieAge){
        this.nom = nom;
        this.prix = prix;
        this.distributeur = distributeur;
        this.description = description;
        this.categorieAge = categorieAge;
        this.categorieProduit = categorieProduit;
    }
    
    public Produit(float prix, Produit produitsAutresCategories, CategorieProduit categorieProduit){
        this.prix = prix;
        this.categorieProduit = categorieProduit;
        this.categorieAge = produitsAutresCategories.categorieAge;
        this.description = produitsAutresCategories.description;
        this.distributeur = produitsAutresCategories.distributeur;
        this.nom = produitsAutresCategories.nom;
        for(Tag t : produitsAutresCategories.tags){
            this.addTag(t);
        }
        produitsAutresCategories.addProduitAutreCategorie(this);
    }

    public int getNombreDeConsultation() {
        return nombreDeConsultation;
    }
    
    public void incrementerNombreDeConsultation() {
        this.nombreDeConsultation++;
    }

    public CategorieProduit getCategorieProduit() {
        return categorieProduit;
    }

    public final void setCategorieProduit(CategorieProduit categorieProduit) {
        for(Produit p : this.produitsAutresCategories){
            if(p.categorieProduit.equals(categorieProduit))
                return;
        }
        this.categorieProduit = categorieProduit;
    }

    public Collection<Produit> getProduitsAutresCategories() {
        return produitsAutresCategories;
    }
    public boolean existsAutresCategories()
    {
        if(this.produitsAutresCategories.size()<=0) 
            return false;
        else return true;
    }

    public void addProduitAutreCategorie(Produit produitAutreCategorie) {    
        for(Produit p : produitAutreCategorie.produitsAutresCategories){
            for(Produit p2 : this.produitsAutresCategories){
                if(p2.categorieProduit.equals(p.categorieProduit) && (p != p2 || !p.equals(p2)))
                    return;
                if(!p2.description.equals(p.description) || !p2.distributeur.equals(p.distributeur) 
                        || !p2.nom.equals(p.nom) || !p2.tags.equals(p.tags) || !p2.categorieAge.equals(p.categorieAge))
                    return;
            }
        }
        if(produitAutreCategorie.categorieProduit != null && produitAutreCategorie.categorieProduit.equals(this.categorieProduit))
                return;
        if(!produitAutreCategorie.categorieAge.equals(this.categorieAge) 
                || !produitAutreCategorie.description.equals(this.description)
                || !produitAutreCategorie.distributeur.equals(this.distributeur) || !produitAutreCategorie.nom.equals(this.nom)
                || !produitAutreCategorie.tags.equals(this.tags))
                    return;
        for(Produit p : produitAutreCategorie.produitsAutresCategories){
            if(this.produitsAutresCategories.contains(p) || p == this)
                continue;
            this.produitsAutresCategories.add(p);
            p.addProduitAutreCategorie(this);
        }
        if(this.produitsAutresCategories.contains(produitAutreCategorie))
            return;
        this.produitsAutresCategories.add(produitAutreCategorie);
        produitAutreCategorie.addProduitAutreCategorie(this);
    }
    
    public void removeProduitAutrecategorie(Produit produitAutreCategorie){
        if(!this.produitsAutresCategories.contains(produitAutreCategorie))
            return;
        this.produitsAutresCategories.remove(produitAutreCategorie);
        produitAutreCategorie.removeProduitAutrecategorie(this);        
    }

    public CategorieAge getCategorieAge() {
        return categorieAge;
    }

    public final void setCategorieAge(CategorieAge categorieAge) {
        if(this.categorieAge != null && this.categorieAge.equals(categorieAge))
            return;
        this.categorieAge = categorieAge;
        for(Produit p : this.produitsAutresCategories){
            if(p.categorieAge != null && p.categorieAge.equals(categorieAge))
                continue;
            p.setCategorieAge(categorieAge);
        }
    }

    public Collection<Photo> getPhotos() {
        return photos;
    }

    public void addPhoto(Photo photo) {
        if(this.photoPrincipale == null){
            this.photoPrincipale = photo;
        }
        this.photos.add(photo);
    }
    
    public void removePhoto(Photo photo) {
        this.photos.remove(photo);
        if(this.photoPrincipale.equals(photo)){
            if(this.photos.isEmpty()){
                this.photoPrincipale = null;
            } else {
                this.photoPrincipale = ((ArrayList<Photo>)(this.photos)).get(0);
            }
        }
    }

    public Photo getPhotoPrincipal() {
        return photoPrincipale;
    }

    public void setPhotoPrincipal(Photo photoPrincipal) {
        this.photos.add(photoPrincipal);
        this.photoPrincipale = photoPrincipal;
    }

    public Collection<Tag> getTags() {
        return tags;
    }
    public boolean hasTags() {
        if(tags.size()<=0)
            return false;
        else return true;
    }
    public void addTag(Tag tag) {
        if(this.tags.contains(tag))
            return;
        this.tags.add(tag);
        tag.addProduit(this);
        for(Produit p : this.produitsAutresCategories){
            tag.addProduit(p);                        
        }
    }
    
    public void removeTag(Tag tag) {
        if(!this.tags.contains(tag))
            return;
        this.tags.remove(tag);
        tag.removeProduit(this);
        for(Produit p : this.produitsAutresCategories){
            p.removeTag(tag);
        }
    }

    public Collection<Video> getVideos() {
        return videos;
    }
    public boolean hasVideos() {
        if(videos.size() > 0)
            return true;
        else return false;
    }
    public void addVideo(Video video) {
        this.videos.add(video);
    }
    
    public void removeVideo(Video video) {
        this.videos.remove(video);
    }

    public int getId() {
        return id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        if(this.description != null && this.description.equals(description))
            return;
        this.description = description;
        for(Produit p : this.produitsAutresCategories){
            if(p.description != null && p.description.equals(description))
                continue;
            p.setDescription(description);
        }
        this.description = description;
    }

    public String getDistributeur() {
        return distributeur;
    }

    public void setDistributeur(String distributeur) {
        if(this.distributeur != null && this.distributeur.equals(distributeur))
            return;
        this.distributeur = distributeur;
        for(Produit p : this.produitsAutresCategories){
            if(p.distributeur != null && p.distributeur.equals(distributeur))
                continue;
            p.setDistributeur(distributeur);
        }
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        if(this.nom != null && this.nom.equals(nom))
            return;
        this.nom = nom;
        for(Produit p : this.produitsAutresCategories){
            if(p.nom != null && p.nom.equals(nom))
                continue;
            p.setNom(nom);
        }
    }

    public float getPrix() {
        return prix;
    }

    public void setPrix(float prix) {
        this.prix = prix;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (int) id;
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Produit)) {
            return false;
        }
        Produit other = (Produit) object;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "modeles.produits.Produit[id=" + id + "]";
    }
}
